package com.loong.android;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

/**
 * 界面碎片(Fragment)。可实现在一个窗口界面上载入不同的布局，实现界面布局的模块化管理。
 */
public class LonFragment extends androidx.fragment.app.Fragment {

    protected String fragmentTag = null;
    protected String fragmentName = null;
    protected Object fragmentData = null;

    public LonFragment() {

    }

    public LonFragment(String fragmentTag) {
        this.fragmentTag = fragmentTag;
    }

    public LonFragment(String fragmentTag, String fragmentName) {
        this.fragmentTag = fragmentTag;
        this.fragmentName = fragmentName;
    }

    public LonFragment(String fragmentTag, String fragmentName, Object fragmentData) {
        this.fragmentTag = fragmentTag;
        this.fragmentName = fragmentName;
        this.fragmentData = fragmentData;
    }

    /**
     * 获取界面碎片自定义的标签内容
     */
    public String getFragmentTag() {
        return fragmentTag;
    }

    /**
     * 设置界面碎片自定义的标签内容
     * @param fragmentTag 标签内容
     */
    public LonFragment setFragmentTag(String fragmentTag) {
        this.fragmentTag = fragmentTag;
        return this;
    }

    /**
     * 获取界面碎片自定义的名称
     */
    public String getFragmentName() {
        return fragmentName;
    }

    /**
     * 设置界面碎片自定义的名称
     * @param fragmentName 名称
     */
    public LonFragment setFragmentName(String fragmentName) {
        this.fragmentName = fragmentName;
        return this;
    }

    /**
     * 获取界面碎片自定义的附加数据
     */
    public Object getFragmentData() {
        return fragmentData;
    }

    /**
     * 设置界面碎片自定义的附加数据
     * @param fragmentData 数据
     */
    public LonFragment setFragmentData(Object fragmentData) {
        this.fragmentData = fragmentData;
        return this;
    }

    /**
     * 启动窗口
     * @param targetWin 目标窗口类
     * @param intent 传入数据
     */
    public void startWin(Class<? extends Activity> targetWin, Intent intent) {
        Intent in = intent == null ? new Intent() : intent;
        in.setClass(getContext(), targetWin);
        super.startActivity(in);
    }

    /**
     * 启动窗口
     * @param targetWin 目标窗口对象
     */
    public void startWin(Class<? extends Activity> targetWin) {
        startWin(targetWin, null);
    }

    /**
     * 启动窗口
     * @param intent 传入数据
     */
    public void startWin(Intent intent) {
        super.startActivity(intent);
    }

    /**
     * 启动窗口
     * @param intent 传入数据
     * @param bundle 配置项
     */
    public void startWin(Intent intent, Bundle bundle) {
        super.startActivity(intent, bundle);
    }

    /**
     * 启动窗口
     * @param intent 传入数据
     * @param requestCode 请求码
     */
    public void startWinResult(Intent intent, int requestCode) {
        super.startActivityForResult(intent, requestCode);
    }

    /**
     * 启动窗口
     * @param intent 传入数据
     * @param requestCode 请求码
     * @param bundle 配置项
     */
    public void startWinResult(Intent intent, int requestCode, Bundle bundle) {
        super.startActivityForResult(intent, requestCode, bundle);
    }

    /**
     * 获取界面碎片的视图对象
     */
    public View getFragmentView() {
        return super.getView();
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        onFragmentCreate(savedInstanceState);
    }

    @Nullable @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return onFragmentCreateView(container, savedInstanceState);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        onFragmentViewCreated(view, savedInstanceState);
    }

    @Override
    public void onResume() {
        super.onResume();
        onFragmentResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        onFragmentPause();
    }

    @Override
    public void onStart() {
        super.onStart();
        onFragmentStart();
    }

    @Override
    public void onStop() {
        super.onStop();
        onFragmentStop();
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        onFragmentAttach(context);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        onFragmentDestroy();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        onFragmentDestroyView();
    }

    @Override
    public void onDetach() {
        super.onDetach();
        onFragmentDetach();
    }

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        onFragmentHiddenChanged(hidden);
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        onFragmentVisibleChange(isVisibleToUser);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        onWinResult(requestCode, resultCode, intent);
    }

    /**
     * 界面碎片被创建
     * @param bundle 传入数据
     */
    protected void onFragmentCreate(Bundle bundle) {

    }

    /**
     * 界面碎片创建视图的事件。返回一个视图对象作为碎片显示的视图
     * @param parent 父视图对象
     * @param bundle 传入数据
     */
    protected View onFragmentCreateView(ViewGroup parent, Bundle bundle) {
        return null;
    }

    /**
     * 界面碎片完成视图创建后的事件，可以在这个事件内做一些初始化操作
     * @param view 视图对象
     * @param bundle 传入数据
     */
    protected void onFragmentViewCreated(View view, Bundle bundle) {

    }

    /**
     * 界面碎片就绪完毕的事件，当可视并且开始运行的时候触发，通常与窗口的就绪完毕事件(onWinResume)有关联
     */
    protected void onFragmentResume() {

    }

    /**
     * 界面碎片被暂停的事件，通常与窗口的被暂停事件(onWinPause)有关联
     */
    protected void onFragmentPause() {

    }

    /**
     * 界面碎片启动完毕的事件，当启动并可视后触发，通常与窗口启动完毕事件(onWinStart)有关联
     */
    protected void onFragmentStart() {

    }

    /**
     * 界面碎片被暂停的事件，通常与窗口被暂停事件(onWinStop)有关联
     */
    protected void onFragmentStop() {

    }

    /**
     * 界面碎片贴附到窗口的事件
     * @param context 上下文
     */
    protected void onFragmentAttach(Context context) {

    }

    /**
     * 界面碎片被销毁的事件
     */
    protected void onFragmentDestroy() {

    }

    /**
     * 界面碎片的视图被销毁的事件
     */
    protected void onFragmentDestroyView() {

    }

    /**
     * 界面碎片脱离窗口的事件
     */
    protected void onFragmentDetach() {

    }

    /**
     * 界面碎片隐藏状态改变的事件
     * @param hidden 是否隐藏
     */
    protected void onFragmentHiddenChanged(boolean hidden) {

    }

    /**
     * 界面碎片可视状态改变
     * @param isVisibleToUser 是否可视
     */
    protected void onFragmentVisibleChange(boolean isVisibleToUser) {

    }

    /**
     * 窗口返回结果的事件
     * @param requestCode 请求码
     * @param resultCode 结果码
     * @param intent 意图数据对象
     */
    protected void onWinResult(int requestCode, int resultCode, Intent intent) {

    }
}
